package bosque.unc;

import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.Properties;

import bosque.unc.enumerations.Direccion;
import bosque.unc.enumerations.EncoderNombre;
import bosque.unc.enumerations.Sensor;
import bosque.unc.exceptions.ManoplaException;
import bosque.unc.gui.Scoba;

public class Inicializacion extends Thread 
{
	private Scoba scoba;
	private ControladorUSB controlador;
	private Boolean flagConectado = false;
	private EncendidoConsola encendidoConsola;
	private Integer delayEncendido = 2000;
	private Integer delayPulsador = 2000;
		
	
	public Inicializacion(Scoba s)
	{
		this.scoba = s;
		this.controlador = scoba.getControlador();
		
		
	}
	
	public void run()
	{		
		while(true)
		{
			
			if(this.controlador.isDevicePresent())
			{
				scoba.getLblStatusBarUsb().setForeground(Color.GREEN);
				scoba.getLblStatusBarUsb().setText("OK");
			
				
					try {
						//if(this.controlador.isDeviceOpened())
						{
							
						}
						//else
						{
							//System.out.println("abriendo dispositivo...");
							//controlador.abrirDispositivoUSB(0x04d8, 0x0042);
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				
				
			}
			else
			{
				scoba.getLblStatusBarUsb().setForeground(Color.RED);
				scoba.getLblStatusBarUsb().setText("ERROR");
				
			}
			
			//System.out.println(scoba.getLecturas().getSensores().get(Sensor.FUNCIONAMIENTO));
			if(scoba.getLecturas().getSensores().get(Sensor.FUNCIONAMIENTO).equals(170))
			{
				
				scoba.getLblStatusBarInterfaz().setForeground(Color.GREEN);
				scoba.getLblStatusBarInterfaz().setText("OK");
				
			}
			else
			{
				
				scoba.getLblStatusBarInterfaz().setForeground(Color.RED);
				scoba.getLblStatusBarInterfaz().setText("ERROR");
			}
			
			try {
				this.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				
		}
	}
	
	public void getFreeMem()
	{
		Runtime runtime = Runtime.getRuntime();

	    NumberFormat format = NumberFormat.getInstance();

	    StringBuilder sb = new StringBuilder();
	    long maxMemory = runtime.maxMemory();
	    long allocatedMemory = runtime.totalMemory();
	    long freeMemory = runtime.freeMemory();

	    sb.append("free memory: " + format.format(freeMemory / 1024 / 1024) + "\n");
	    sb.append("allocated memory: " + format.format(allocatedMemory / 1024 / 1024) + "\n");
	    sb.append("max memory: " + format.format(maxMemory / 1024 / 1024) + "\n");
	    sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024 / 1024) + "\n");
	    
	    System.out.println(sb);
	}
	
	public void encenderConsola()
	{	
		this.encendidoConsola = new EncendidoConsola(this);
		encendidoConsola.start();
	}
	
	/**
	 * Inicializa todo en apagado y detenido.
	 * 
	 */
	public void apagarTodo()
	{
		try {
			this.scoba.getTelescopio().activarMovCalado(false);
		} catch (ManoplaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			this.scoba.getTelescopio().mover(Direccion.PARADO);
		} catch (ManoplaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			this.scoba.getTelescopio().setearVelocidad(this.scoba.getTelescopio().getRampaValMinManopla());
		} catch (ManoplaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		this.scoba.getCupula().mover(Direccion.PARADO);
		this.scoba.getCupula().activarVelLenta(false);
		
		this.scoba.getPlataforma().mover(Direccion.PARADO);
		
		this.scoba.getEspejoSecundario().mover(Direccion.PARADO);
		
		this.scoba.getEspectrografo().activarFiltro0(true);
		this.scoba.getEspectrografo().activarFiltroEnter(false);
		this.scoba.getEspectrografo().activarObturador(false);
		this.scoba.getEspectrografo().activarRanura(false);
		this.scoba.getEspectrografo().moverCamaraCCD(Direccion.PARADO);
		
		
		
	}
	
	public void apagarConsola()
	{
		this.scoba.getConsola().activarInterfaz0(false);
		this.scoba.getConsola().activarInterfaz1(false);
		this.scoba.getConsola().activarTablero(false);
		this.scoba.getTelescopio().activarConmutRampa(false);
		this.scoba.getConsola().activarPulsador(false);
		this.scoba.getConsola().activarRelojeria(false);
		this.scoba.apagarTodo();
	}
	
	
	
	private class EncendidoConsola extends Thread
	{
		Inicializacion inicializacion;
		public EncendidoConsola(Inicializacion ini)
		{
			this.inicializacion = ini;
		}
		public void run()
		{
			apagarTodo(); // ponemos todo en apagado primero
			inicializacion.scoba.getConsola().activarInterfaz0(false);
			inicializacion.scoba.getConsola().activarInterfaz1(false);
			inicializacion.scoba.getConsola().activarTablero(false);
			inicializacion.scoba.getTelescopio().activarConmutRampa(false);
			inicializacion.scoba.getConsola().activarPulsador(false);
			inicializacion.scoba.getConsola().activarRelojeria(false);
			
			inicializacion.scoba.getConsola().activarInterfaz0(false);
			inicializacion.scoba.getConsola().activarInterfaz1(true);
			
			
			try {
				Thread.sleep(delayEncendido);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getConsola().activarTablero(true);
			try {
				Thread.sleep(delayEncendido);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getTelescopio().activarConmutRampa(true);
			try {
				Thread.sleep(delayEncendido);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getTelescopio().activarRelojeria(true);
			try {
				Thread.sleep(delayEncendido);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getConsola().activarPulsador(true);
			try {
				Thread.sleep(delayPulsador);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getConsola().activarPulsador(false);
			
			/* AGREGAR AQUI INICIALIZACION DEL PALPADOR */
			
			inicializacion.scoba.habilitarPaneles();
			inicializacion.scoba.getLecturas().leerEncoder(EncoderNombre.ALFA);
			inicializacion.scoba.getLecturas().leerEncoder(EncoderNombre.DELTA);
			inicializacion.scoba.getLecturas().leerSensores();
			
			inicializacion.scoba.getLecturas().leerPalpador();
			// delay necesario para asegurarse que termine de ejecutarse la secuencia de lecturas
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			inicializacion.scoba.getLecturas().start();		
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//inicializacion.scoba.getMostrar().start();
			
		}
	}

	public Integer getDelayEncendido() {
		return delayEncendido;
	}

	public void setDelayEncendido(Integer delayEncendido) {
		this.delayEncendido = delayEncendido;
	}

	public Integer getDelayPulsador() {
		return delayPulsador;
	}

	public void setDelayPulsador(Integer delayPulsador) {
		this.delayPulsador = delayPulsador;
	}
	
}


